<?php
/**
 * User: LRZ
 * Date: 2020/1/15
 * Time: 11:51
 */

/**
 *  665.数组的度
 *
 *  标签：数组
 *
 *  给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。
 *  你的任务是找到与 nums 拥有相同大小的度的最短连续子数组，返回其长度。
 *
 *  示例 1:
 *      输入: [1, 2, 2, 3, 1]
 *      输出: 2
 *      解释:
 *          输入数组的度是2，因为元素1和2的出现频数最大，均为2.
 *          连续子数组里面拥有相同度的有如下所示:
 *              [1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
 *          最短连续子数组[2, 2]的长度为2，所以返回2.
 *
 *  示例 2:
 *      输入: [1,2,2,3,1,4,2]
 *      输出: 6
 *
 *  注意:
 *      nums.length 在1到50,000区间范围内。
 *      nums[i] 是一个在0到49,999范围内的整数。
 *
 *  来源：力扣（LeetCode）
 *  链接：https://leetcode-cn.com/problems/degree-of-an-array
 *  著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

$start = microtime(true);

$nums = [1, 2, 2, 3, 1];
$res  = findShortestSubArray($nums);

$end = microtime(true);
print_r($res);
printf(' total run: %.2f s<br>' . 'memory usage: %.2f M<br> ', $end - $start, memory_get_usage() / 1024 / 1024);

function findShortestSubArray($nums)
{
    $left  = [];
    $right = [];
    $count = [];
    foreach ($nums as $k => $v) {
        if (!isset($left[$v])) {
            $left[$v] = $k;
        }
        $right[$v] = $k;
        !isset($count[$v]) ? $count[$v] = 1 : $count[$v]++;
    }

    $max = max($count);
    $res = count($nums);
    foreach ($count as $k => $v) {
        if ($v === $max) {
            $temp = $right[$k] - $left[$k] + 1;
            $res  = min($temp, $res);
        }
    }
    return $res;
}